package com.songhq.data.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.ClusterOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.netflix.discovery.converters.Auto;
import com.songhq.data.bean.User;
import com.songhq.data.redis.RedisUtil;


@RestController
@RequestMapping("/redis")
public class RedisController {

	@Autowired
	private RedisUtil redisUtil;
	
	
	@RequestMapping("/set/{key}/{value}")
	public String set(@PathVariable("key")String key ,@PathVariable("value")String value) {
		
		
		redisUtil.set(key, value);
		
		return "key is "+ key +"and value is "+value;
	}
	@RequestMapping("/get/{key}")
	public String get(@PathVariable("key")String key ) {
		
		Object object = redisUtil.get(key);
		
		return "key is "+ key +"and value is "+object.toString();
	}
	@RequestMapping("/setuser/{key}")
	public User setUser(@PathVariable("key")String key ) {
		
		User user = new User();
		user.setName(key);
		
		redisUtil.set(key, user);
		
		
		return user;
	}
	
	@RequestMapping("/getuser/{key}")
	public User getUser(@PathVariable("key")String key ) {
		
		User user =(User) redisUtil.get(key);
		
		return user;
	}
	
	
	/**
	 * 
	 * redis应用在数量控制器的业务场景
	 * 第一个  购物节抢优惠名额有限
	 * 第二个  就是促销活动数量有限
	 * 第三个  就是抢红包，红包的个数有限
	 * 
	 * 计数器版本1
	 * incr 获取增加量 或者 decr 获取减少量 
	 * 
	 * get(key)  （判断） （问题1  两个同时get(key) 不存在，都设置初始值）
	 * 
	 * key不存在的话，就初始化
	 * 
	 * 存在的话，get（key）得到当前的数量
	 * 
	 * 
	 * 当前数量+ 要增加的数量  程序代码判断是否是超过数量（判断）（两个客户端 同时判断都没超过总素，都进行加数量的操作，会导致结果超出设定值）
	 * 
	 * 如果没有则增加  并持久化到mysql等数据库
	 * 如果超过则结束
	 * 
	 * 
	 * 
	 * 版本2
	 * 
	 * 获取将要增加的数量
	 * 
	 * get(key)不存在  设置 值  setnx
	 * 
	 * 再get(key)得到当前数量
	 * 
	 * incrby 当前数量+增加的数量  并会返回增加后的数量
	 * 
	 * （用incrby 返回的结果进行判断）如果没有超过则成功 
	 * 如果超过  则结束
	 * 
	 * 
	 * 
	 * 抽奖限额 
	 * @param key
	 * @return
	 */
	@RequestMapping("/counter/v1")
	public String counter( ) {
		//抽奖限额100
		int limitAmount = 100;
		//每个用户的中奖额为1
		int decrAmount = 1;
		//记录奖品数量的key
		String key = "v1";
		//如果不存v1这个键
		if(!redisUtil.exist(key)) {
			//进行初始化,只剩下5件商品了
			redisUtil.set(key, limitAmount-95);
		}
		//获取当前量
		Object object = redisUtil.get(key);
		int currentAmount = Integer.valueOf(object.toString());
		if(currentAmount -decrAmount < 0) {
			//奖品完了
			System.out.println("很抱歉，奖品被抢完了");
			return  "很抱歉，奖品被抢完了";
		}else {
			//中奖成功，奖奖品数量减1
			redisUtil.decr(key, decrAmount);
			System.out.println("恭喜你中奖了");
			return "恭喜你中奖了";
		}
	}
	@RequestMapping("/counter/v2")
	public String counter2( ) {
		//抽奖限额100
		int limitAmount = 100;
		//每个用户的中奖额为1
		int decrAmount = 1;
		//记录奖品数量的key
		String key = "v2";
		//如果不存v1这个键
		if(!redisUtil.exist(key)) {
			//进行初始化,只剩下5件商品了
			redisUtil.setnx(key, limitAmount-95);
		}
		//获取当前量
		Object object = redisUtil.get(key);
		int currentAmount = Integer.valueOf(object.toString());
		long result = redisUtil.decr(key, decrAmount);
		if(result < 0) {
			//奖品完了
			System.out.println("很抱歉，奖品被抢完了");
			return  "很抱歉，奖品被抢完了";
		}else {
			System.out.println("恭喜你中奖了");
			return "恭喜你中奖了";
		}
	}
}
